import qs from 'qs';




/**
 * 日期格式化
 * parseTime(new Date()) 输出形如 "2023-09-22 17:34:56" 的当前日期和时间
 * parseTime(1632306296) 输出: "2021-09-22 17:38:16"
 * parseTime("2021-09-22T17:38:16.123Z") 输出: "2021-09-22 17:38:16"
 * parseTime(new Date(), "{y}/{m}/{d} - {h}:{i}") 输出形如 "2023/09/22 - 17:38" 的当前日期和时间
 * parseTime(new Date(), "{y}年{m}月{d}日 星期{a} {h}:{i}") 输出形如 "2023年09月22日 星期五 17:38"
 * @param time
 * @param pattern
 * @returns {string|null}
 */
export function parseTime(time, pattern = '{y}-{m}-{d} {h}:{i}:{s}') {
  if (!time) {
    return null;
  }

  const date = toDate(time);

  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };

  return pattern.replace(/{([ymdhisa])+}/g, (match, key) => {
    const value = formatObj[key];
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    return (match.length > 1 && value < 10) ? '0' + value : value;
  });
}

/**
 * Date 、 string 、number 转 Date 类型
 * @param time
 * @returns {*|Date}
 */
export function toDate(time) {
  // If already a Date object, return as-is.
  if (time instanceof Date) {
    return time;
  }

  const getProcessedTime = (input) => {
    // If it's a string in the form of only digits, convert to number.
    if (typeof input === 'string' && /^[0-9]+$/.test(input)) {
      return parseInt(input, 10);
    } else if (typeof input === 'string') {
      // If it's still a string, make sure it's in a format JS Date can recognize.
      return input.replace(/-/g, '/')
        .replace('T', ' ')
        .replace(/\.[\d]{3}/, '');
    }
    return input;
  };

  const processedTime = getProcessedTime(time);

  // If it's a 10-digit number, assume it's in seconds and convert to milliseconds.
  const finalTime = (typeof processedTime === 'number' && processedTime.toString().length === 10)
    ? processedTime * 1000
    : processedTime;

  // Convert the final time to a Date object.
  return new Date(finalTime);
}


// 表单重置
export function resetForm(refName) {
  if (this.$refs[refName]) {
    this.$refs[refName].resetFields();
  }
}

// 添加日期范围
export function addDateRange(params, dateRange, propName) {
  const search = params;
  search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
  dateRange = Array.isArray(dateRange) ? dateRange : [];
  if (typeof (propName) === 'undefined') {
    search.params['beginTime'] = dateRange[0];
    search.params['endTime'] = dateRange[1];
  } else {
    search.params['begin' + propName] = dateRange[0];
    search.params['end' + propName] = dateRange[1];
  }
  return search;
}

// 回显数据字典 从数据字典中 根据 单个value 找出 单个label
export function selectDictLabel(datas, value) {
  if (!value) {
    return "";
  }

  for (const key in datas) {
    if (datas[key].value === String(value)) {
      return datas[key].label;
    }
  }

  return String(value);
}



// 回显数据字典（字符串数组）从数据字典中 根据 values 找出 label，多个用分隔符分隔。
export function selectDictLabels(datas, values, separator = ",") {
  if (!values) {
    return "";
  }

  const valueArray = Array.isArray(values) ? values : values.split(separator);

  const actions = valueArray.map(val => {
    const dataItem = datas.find(item => item.value === String(val));
    return dataItem ? dataItem.label : val;
  });

  return actions.join(separator);
}



// 转换字符串，undefined,null等转化为""
export function parseStrEmpty(str) {
  return (!str || str === "undefined" || str === "null") ? "" : str;
}


/**
 * 构造树型结构数据 一行一行的数据库表结构，转成tree结构
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */

export function handleTree(data, id = 'id', parentId = 'parentId', children = 'children') {
  const map = {};
  const tree = [];

  for (const item of data) {
    const itemId = item[id];
    const itemParentId = item[parentId];

    if (!map[itemId]) {
      map[itemId] = item;
    }

    if (!map[itemParentId]) {
      map[itemParentId] = {};
    }

    if (!map[itemParentId][children]) {
      map[itemParentId][children] = [];
    }

    map[itemParentId][children].push(item);
  }

  for (const item of data) {
    if (!item[parentId] || !map[item[parentId]]) {
      tree.push(item);
    }
  }
  return tree;
}




/**
* 参数处理
* @param {*} params  参数
*/
export function tansParams(params) {
  return qs.stringify(params, { arrayFormat: 'brackets' });
}



// 返回项目路径
// 使用正则表达式/\/+/g来替换所有连续的斜杠为单个斜杠。
// 使用正则表达式/\/$/来移除路径末尾的斜杠。
export function getNormalPath(p = "") {
  if (!p || p === "undefined") {
    return "";
  }
  return p.replace(/\/+/g, '/').replace(/\/$/, '');
}


// 验证是否为blob格式
export function blobValidate(data) {
  return data.type !== 'application/json'
}
